package empacotador;

import java.io.IOException;

import javax.comm.NoSuchPortException;
import javax.comm.PortInUseException;

import comunicacao.Comunicacao;

import ui.InterfaceUsuario;

public class Empacotador {
	public Empacotador(String filePath, int tamanhoDados, String origem, String destino, int timeout, 
			    int tentativas, int modo, InterfaceUsuario ui) 
		throws IOException, Exception
	{
		this.fileManager     = new FileManager(filePath);
		this.tamanhoDados    = tamanhoDados;
		this.origem          = origem;
		this.destino         = destino;
		this.ui              = ui;
		this.modo            = modo;
		this.timeout		 = timeout;
		this.tentativas		 = tentativas;
		/* Calculo errado tamanho = 12 e tamanhoDados = 6 => numeroDePacotes = 3 */
		this.numeroDePacotes = (int) Math.floor( (fileManager.tamanho()/tamanhoDados)+1 );
		
		if (numeroDePacotes > 256)
			throw new Exception("Numero de pacotes excedido.");
		
		this.pacotesEnviados = new boolean[numeroDePacotes];
		
		comm = new Comunicacao();
		comm.lerDados();

	}
	
	public byte[] lerBytes(int nPacote) throws IOException
	{
		int offset = (tamanhoDados*nPacote)-tamanhoDados;
		byte[] dados = fileManager.ler_bytes(tamanhoDados, offset);
		return dados;
	}
	
	public PacoteDeDados geraPacoteDeDados(int nPacote) throws IOException, Exception
	{
		String nomeDoArquivo = (nPacote > 1) ? "" : fileManager.nome();
		
		PacoteDeDados p = new PacoteDeDados(nPacote,origem,destino,nomeDoArquivo,lerBytes(nPacote));
		return p;
		
	}
	
	public PacoteDeResposta geraPacoteDeResposta(int nPacote,int resposta)
	{
		return new PacoteDeResposta(nPacote,origem,destino,resposta);
	}
	
	public void enviaPacotes() throws IOException, Exception
	{
		int n = 1;
		int tentativas = 0;
		boolean aborta = false;
		
		while(n <= numeroDePacotes && !aborta)
		{
			if (tentativas > this.tentativas)
				throw new Exception("Numero de tentativas excedidas");
			
			PacoteDeDados p = geraPacoteDeDados(n);
			
			
			try {
				comm.envia(p.getPacote());
				Thread.sleep(timeout*1000);
			} catch(Exception e) {}
			
			/*
			if (pacotesEnviados[n-1])
			{
				pacotesEnviados[n-1] = true;
				tentativas = 0;
				n++;
			} else {
				tentativas++;
			}
			*/
			
			n++;
			
			//ui.log(p.dump());
			

		}
		
	}
	
	public void recebePacotes()
	{
		
		
	}
	
	/*
	 * FIXME - rotina para apendar os dados ja recebidos em um arquivo binario 
	 */
	

	private FileManager fileManager;
	private int tamanhoDados;
	private int numeroDePacotes;
	private boolean[] pacotesEnviados;
	private String origem;
	private String destino;
	private int modo;
	private InterfaceUsuario ui;
	private int timeout;
	private int tentativas;
	private Comunicacao comm;
	
	public static final int EMISSOR  = 0;
	public static final int RECEPTOR = 1;
	


}
